package modbus

import (
	"dcs/dcslog"
	"fmt"
)

// 应答报文样例： 00 00 00 00 00 07   01 03   04   00 02 00 03   f2
//07：表示后面有多少个字节（不包括校验和）
//01：从机地址
//03：读寄存器
//04：字节数   = N*2   N 寄存器数量
//00 02：第一个寄存器的值
//00 03：第二个寄存器的值
//F2：0xff减去从机地址及后面所有字节的和（不计溢出）

func Modbus_decode(frame []byte, real_len int) []byte {
	// 暂时不考虑 一个完整报文 包含 多个帧的 情况

	if real_len < 9 {
		return nil
	}

	theory_len := uint16(frame[5])
	theory_length := int(theory_len + 7)
	if real_len != theory_length {
		dcslog.Logger.Printf("数据长度不匹配，real_len:%v, theory_length:%v .\n", real_len, theory_length)
		fmt.Printf("数据长度不匹配，real_len:%v, theory_length:%v .\n", real_len, theory_length)
	}

	// 对 响应数据 做 校验和
	var result uint8 = 0
	for i := 6; i < real_len-1; i++ {
		result += frame[i]
	}

	// 0xff减去从机地址及后面所有字节的和（不计溢出）
	checksum_val := 0xff - frame[real_len-1]
	if result != checksum_val {
		dcslog.Logger.Printf("校验和检测不匹配，result:%v, checksum:%v .\n", result, checksum_val)
		fmt.Printf("校验和检测不匹配，result:%v, checksum:%v .\n", result, checksum_val)
	}

	payload_len := int(frame[8])

	if 9+payload_len > real_len {
		return nil
	}

	return frame[9 : 9+payload_len]
}
